package Flightadministration;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import DB.*;
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
/**
 * RMI-Server, der gestartet wird um die eigentlichen RMI-Server-Objekte zu
 * instantiieren.
 *
 * @author Florian Härer, in Anlehnung an BankProjekt 1.1 von Prof.Dr.Thies
 * @author Stefan Fellner
 */

public class Flightserver {
    /**
     * Das Verwaltungsobjekt "administration" wird als zentrales Objekt in der RMI Registry eingetragen und bereit gestellt.
     * Dieses Verwaltungsobjekt ermöglicht den Clients, den Zugriff auf alle Methoden, die in der Flightadministration Klasse vorhanden sind.
     * Die Clients, können dadurch auf alle Operationen der Verwaltungsklasse zugreifen. Dabei können z.B. Aircrafts oder Airlines verwaltet werden.
     * Jede dieser Operationen stellt eine Geschäftstransaktion dar, die mit der GUI eingeleitet wird und anschließend von der Administrationsklasse verarbeitet wird.
     */
    private Flightadministration administration = null;

    public Flightserver() {

        try {
            /**
             * Neue Registry einholen und mit dem Well-Known-Port registrieren. Der Well-Known Port ist 1099.
             * Quelle: http://www.iks.hs-merseburg.de/~uschroet/Literatur/Java_Lit/JAVA_Insel/javainsel_19_003.htm
             */
            LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
            Registry registry = LocateRegistry.getRegistry();

            /**
             * Der Konstruktor der FlightadministrationImpl Klasse erwartet jeweils eine Instanz der Mapper Klassen. Die Methode getInstance() in den jewiligen
             * MapperKlassen, gibt eine existierende Instanz zurück oder erstellt eine neue Instanz. Dadurch ist der Zugriff auf alle DBMapper mittels der
             * FlightadministrationImpl-Klasse gewährleistet.
             */
            administration = new FlightadministrationImpl(AirportMapper.getInstance(), AirlineMapper.getInstance(),
                                                            AircraftMapper.getInstance(), TypeOfAircraftMapper.getInstance(),
                                                            FlightMapper.getInstance(), FlightRealizationMapper.getInstance(),
                                                            PassengerMapper.getInstance(), SeatMapper.getInstance(), BookingMapper.getInstance());

            /**
             * Wir melden das administration-Objekt bei einer RMI-Registry mit dem Namen Flightadministration an.
             */
            Naming.rebind("rmi://localhost:1099/Flightadministration", administration);
            System.out.println("Flightadministration wurde in Registry eingetragen...");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

     public static void main(String args[]) {

         //Diese Art von Instanziierung, macht es möglich, das Ausführen des Garbage Collectors für dieses Objekt zu vermeiden.
        new Flightserver();
        System.out.println("Flugadministrationsserver gestartet...");
    }

}